package com.cskaoyan.javase.object._6clone;

/**
 * 空接口的作用,模拟实现java.lang.Cloneable接口的作用
 * 提示: instanceof
 * 引用 instanceof 类名/接口名
 *      表示判断引用所指向的对象是否是后面类名/接口的对象或者子类对象(对于接口或者抽象类,都是判断子类对象)
 *
 * 一个类实现了一个空接口,表面上看没有得到任何成员,但是这个类的数据类型却发生了变化:
 *      从原先不是这个空接口的子类,变成了它的子类
 * 于是就可以配合instanceof关键字来做判断,并对应做出不同操作
 * 这种空接口,实际上起着一种标记的作用,也就是常说的"标记接口"
 *
 * @since 16:16
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Car c = new Car();
        judgeObjectImplEmpty(c);
    }

    /**
     * 判断该引用指向的对象的类型是否实现空接口 EmptyInterface
     * @param o 被判断的引用
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/14 16:20
     */
    public static void judgeObjectImplEmpty(Object o) throws CloneNotSupportedException {
        if (o instanceof EmptyInterface) {
            // 实现了空接口EmptyInterface
            System.out.println("实现了空接口,允许做xxx操作");
            return;
        }
        // 没有实现空接口EmptyInterface
        // System.out.println("没有实现空接口,不允许做xxx操作,抛出异常,终止程序!");
        throw new CloneNotSupportedException("我不允许,不能做克隆操作!");
    }
}

interface EmptyInterface {
}

class Car{
}